Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


meshchatx/src/backend/rncp_handler.py 93974edf3f77e2de3301e3e9295a7bece80d89cc (93974edf) Text, 16.68 KB

Tff7b72import T7ee787asyncio
Tff7b72import T7ee787os
Tff7b72import T7ee787shutil
Tff7b72import T7ee787time
Tff7b72from T7ee787collectionsT7ee787.T7ee787abc Tff7b72import Te6edf3Callable

Tff7b72import T7ee787RNS


Tff7b72class T56d364RNCPHandlerTb4b4b4:
Te6edf3APP_NAME Tff7b72= Ta5d6ff"Ta5d6ffrncpTa5d6ff"
Te6edf3REQ_FETCH_NOT_ALLOWED Tff7b72= T79c0ff0xF0

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3reticulum_instanceTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3storage_dirTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreticulum Tff7b72= Te6edf3reticulum_instance
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3identity
Tff7b72selfTff7b72.Td2a8ffstorage_dir Tff7b72= Te6edf3storage_dir
Tff7b72selfTff7b72.Td2a8ffactive_transfers Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffreceive_destination Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fffetch_jail Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fffetch_auto_compress Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffallow_overwrite_on_receive Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffallowed_identity_hashes Tff7b72= Tb4b4b4[Tb4b4b4]

Tff7b72def Td2a8ffsetup_receive_destinationTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3allowed_hashesTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3fetch_allowedTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3fetch_jailTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3allow_overwriteTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3allowed_hashesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffallowed_identity_hashes Tff7b72= Tb4b4b4[
Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3hTb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3hTb4b4b4, Tffa657strTb4b4b4) Tff7b72else Te6edf3h Tff7b72for Te6edf3h Tff7b72in Te6edf3allowed_hashes
Tb4b4b4]

Tff7b72selfTff7b72.Td2a8fffetch_jail Tff7b72= Te6edf3fetch_jail
Tff7b72selfTff7b72.Td2a8ffallow_overwrite_on_receive Tff7b72= Te6edf3allow_overwrite

Te6edf3identity_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffidentitypathTb4b4b4, Tff7b72selfTff7b72.Td2a8ffAPP_NAMETb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3identity_pathTb4b4b4)Tb4b4b4:
Te6edf3receive_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3identity_pathTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3receive_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3receive_identityTff7b72.Td2a8ffto_fileTb4b4b4(Te6edf3identity_pathTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffreceive_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(
Te6edf3receive_identityTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4,
Tff7b72selfTff7b72.Td2a8ffAPP_NAMETb4b4b4,
Ta5d6ff"Ta5d6ffreceiveTa5d6ff"Tb4b4b4,
Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffreceive_destinationTff7b72.Td2a8ffset_link_established_callbackTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_client_link_establishedTb4b4b4,
Tb4b4b4)

Tff7b72if Te6edf3fetch_allowedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceive_destinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(
Ta5d6ff"Ta5d6fffetch_fileTa5d6ff"Tb4b4b4,
Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ff_fetch_requestTb4b4b4,
Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_LISTTb4b4b4,
Te6edf3allowed_listTff7b72=Tff7b72selfTff7b72.Td2a8ffallowed_identity_hashesTb4b4b4,
Tb4b4b4)

Tff7b72return Tff7b72selfTff7b72.Td2a8ffreceive_destinationTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_client_link_establishedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3linkTff7b72.Td2a8ffset_remote_identified_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_receive_sender_identifiedTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_strategyTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACCEPT_APPTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_receive_resource_callbackTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_started_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_receive_resource_startedTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_concluded_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_receive_resource_concludedTb4b4b4)

Tff7b72def Td2a8ff_receive_sender_identifiedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3identityTff7b72.Td2a8ffhash Tff7b72not Tff7b72in Tff7b72selfTff7b72.Td2a8ffallowed_identity_hashesTb4b4b4:
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_receive_resource_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Te6edf3sender_identity Tff7b72= Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffget_remote_identityTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3sender_identity Tff7b72and Te6edf3sender_identityTff7b72.Td2a8ffhash Tff7b72in Tff7b72selfTff7b72.Td2a8ffallowed_identity_hashesTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72return Tff7b72False

Tff7b72def Td2a8ff_receive_resource_startedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Te6edf3transfer_id Tff7b72= Te6edf3resourceTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4[Te6edf3transfer_idTb4b4b4] Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffresourceTa5d6ff"Tb4b4b4: Te6edf3resourceTb4b4b4,
Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffreceivingTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffstarted_atTa5d6ff"Tb4b4b4: Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}

Tff7b72def Td2a8ff_receive_resource_concludedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Te6edf3transfer_id Tff7b72= Te6edf3resourceTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffmetadataTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3filename Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(
Te6edf3resourceTff7b72.Td2a8ffmetadataTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3save_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4, Ta5d6ff"Ta5d6ffrncp_receivedTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3save_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)

Te6edf3saved_filename Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3save_dirTb4b4b4, Te6edf3filenameTb4b4b4)
Te6edf3counter Tff7b72= T79c0ff0

Tff7b72if Tff7b72selfTff7b72.Td2a8ffallow_overwrite_on_receiveTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3saved_filenameTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3saved_filenameTb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
T8b949e# Failed to delete existing file, which is fine,
T8b949e# we'll just fall through to the naming loop
Tff7b72pass

Tff7b72while Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3saved_filenameTb4b4b4)Tb4b4b4:
Te6edf3counter Tff7b72+Tff7b72= T79c0ff1
Te6edf3baseTb4b4b4, Te6edf3ext Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffsplitextTb4b4b4(Te6edf3filenameTb4b4b4)
Te6edf3saved_filename Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(
Te6edf3save_dirTb4b4b4,
Ta5d6fffTa5d6ff"Tffd700{Te6edf3baseTffd700}Ta5d6ff.Tffd700{Te6edf3counterTffd700}Tffd700{Te6edf3extTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)

Te6edf3shutilTff7b72.Td2a8ffmoveTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffdataTff7b72.Td2a8ffnameTb4b4b4, Te6edf3saved_filenameTb4b4b4)

Tff7b72if Te6edf3transfer_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4[Te6edf3transfer_idTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffcompletedTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4[Te6edf3transfer_idTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffsaved_pathTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4(
Te6edf3saved_filename
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4[Te6edf3transfer_idTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fffilenameTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3filename
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Te6edf3transfer_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4[Te6edf3transfer_idTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6fferrorTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4[Te6edf3transfer_idTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4] Tff7b72= Tffa657strTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72elif Te6edf3transfer_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4[Te6edf3transfer_idTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6fffailedTa5d6ff"

Tff7b72def Td2a8ff_fetch_requestTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3pathTb4b4b4,
Te6edf3dataTb4b4b4,
Te6edf3request_idTb4b4b4,
Te6edf3link_idTb4b4b4,
Te6edf3remote_identityTb4b4b4,
Te6edf3requested_atTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fffetch_jailTb4b4b4:
Tff7b72if Te6edf3dataTff7b72.Td2a8ffstartswithTb4b4b4(Tff7b72selfTff7b72.Td2a8fffetch_jail Tff7b72+ Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreplaceTb4b4b4(Tff7b72selfTff7b72.Td2a8fffetch_jail Tff7b72+ Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3file_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8fffetch_jailTffd700}Ta5d6ff/Tffd700{Te6edf3dataTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3file_pathTff7b72.Td2a8ffstartswithTb4b4b4(Tff7b72selfTff7b72.Td2a8fffetch_jail Tff7b72+ Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffREQ_FETCH_NOT_ALLOWED
Tff7b72elseTb4b4b4:
Te6edf3file_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)

Te6edf3target_link Tff7b72= Tff7b72None
Tff7b72for Te6edf3link Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffactive_linksTb4b4b4:
Tff7b72if Te6edf3linkTff7b72.Td2a8fflink_id Tff7b72== Te6edf3link_idTb4b4b4:
Te6edf3target_link Tff7b72= Te6edf3link
Tff7b72break

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3file_pathTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False

Tff7b72if Te6edf3target_linkTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3metadata Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3file_pathTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4}
Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(
Tffa657openTb4b4b4(Te6edf3file_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3target_linkTb4b4b4,
Te6edf3metadataTff7b72=Te6edf3metadataTb4b4b4,
Te6edf3auto_compressTff7b72=Tff7b72selfTff7b72.Td2a8fffetch_auto_compressTb4b4b4,
Tb4b4b4)
Tff7b72return Tff7b72True
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return Tff7b72False

Tff7b72return Tff7b72None

Tff7b72async Tff7b72def Td2a8ffsend_fileTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3destination_hashTb4b4b4: Tffa657bytesTb4b4b4,
Te6edf3file_pathTb4b4b4: Tffa657strTb4b4b4,
Te6edf3timeoutTb4b4b4: Tffa657float Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUTTb4b4b4,
Te6edf3on_progressTb4b4b4: Te6edf3CallableTb4b4b4[Tb4b4b4[Tffa657floatTb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4] Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3no_compressTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3file_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3file_pathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3file_pathTb4b4b4)Tb4b4b4:
Te6edf3msg Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffFile not found: Tffd700{Te6edf3file_pathTffd700}Ta5d6ff"
Tff7b72raise Tf85149FileNotFoundErrorTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)

Te6edf3timeout_after Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3timeout
Tff7b72while Tb4b4b4(
Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4) Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3timeout_after
Tb4b4b4)Tb4b4b4:
Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)

Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffPath not found to destinationTa5d6ff"
Tff7b72raise Tf85149TimeoutErrorTb4b4b4(Te6edf3msgTb4b4b4)

Te6edf3receiver_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3receiver_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(
Te6edf3receiver_identityTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4,
Tff7b72selfTff7b72.Td2a8ffAPP_NAMETb4b4b4,
Ta5d6ff"Ta5d6ffreceiveTa5d6ff"Tb4b4b4,
Tb4b4b4)

Te6edf3link Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3receiver_destinationTb4b4b4)
Te6edf3timeout_after Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3timeout
Tff7b72while Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVE Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3timeout_afterTb4b4b4:
Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)

Tff7b72if Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffCould not establish link to destinationTa5d6ff"
Tff7b72raise Tf85149TimeoutErrorTb4b4b4(Te6edf3msgTb4b4b4)

Te6edf3linkTff7b72.Td2a8ffidentifyTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4)

Te6edf3auto_compress Tff7b72= Tff7b72not Te6edf3no_compress
Te6edf3metadata Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3file_pathTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4}

Tff7b72def Td2a8ffprogress_callbackTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3on_progressTb4b4b4:
Te6edf3progress Tff7b72= Te6edf3resourceTff7b72.Td2a8ffget_progressTb4b4b4(Tb4b4b4)
Te6edf3on_progressTb4b4b4(Te6edf3progressTb4b4b4)

Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(
Tffa657openTb4b4b4(Te6edf3file_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3linkTb4b4b4,
Te6edf3metadataTff7b72=Te6edf3metadataTb4b4b4,
Te6edf3callbackTff7b72=Te6edf3progress_callbackTb4b4b4,
Te6edf3progress_callbackTff7b72=Te6edf3progress_callbackTb4b4b4,
Te6edf3auto_compressTff7b72=Te6edf3auto_compressTb4b4b4,
Tb4b4b4)

Te6edf3transfer_id Tff7b72= Te6edf3resourceTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4[Te6edf3transfer_idTb4b4b4] Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffresourceTa5d6ff"Tb4b4b4: Te6edf3resourceTb4b4b4,
Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffsendingTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffstarted_atTa5d6ff"Tb4b4b4: Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fffile_pathTa5d6ff"Tb4b4b4: Te6edf3file_pathTb4b4b4,
Tb4b4b4}

Tff7b72while Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72< Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72> Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffFile was not accepted by destinationTa5d6ff"
Tff7b72raise Tf85149ExceptionTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72if Te6edf3transfer_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4[Te6edf3transfer_idTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffcompletedTa5d6ff"
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6fftransfer_idTa5d6ff"Tb4b4b4: Te6edf3transfer_idTb4b4b4,
Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffcompletedTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffile_pathTa5d6ff"Tb4b4b4: Te6edf3file_pathTb4b4b4,
Tb4b4b4}
Tff7b72if Te6edf3transfer_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4[Te6edf3transfer_idTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6fffailedTa5d6ff"
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffTransfer failedTa5d6ff"
Tff7b72raise Tf85149ExceptionTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72async Tff7b72def Td2a8fffetch_fileTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3destination_hashTb4b4b4: Tffa657bytesTb4b4b4,
Te6edf3file_pathTb4b4b4: Tffa657strTb4b4b4,
Te6edf3timeoutTb4b4b4: Tffa657float Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUTTb4b4b4,
Te6edf3on_progressTb4b4b4: Te6edf3CallableTb4b4b4[Tb4b4b4[Tffa657floatTb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4] Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3save_pathTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3allow_overwriteTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)

Te6edf3timeout_after Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3timeout
Tff7b72while Tb4b4b4(
Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4) Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3timeout_after
Tb4b4b4)Tb4b4b4:
Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)

Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffPath not found to destinationTa5d6ff"
Tff7b72raise Tf85149TimeoutErrorTb4b4b4(Te6edf3msgTb4b4b4)

Te6edf3listener_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3listener_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(
Te6edf3listener_identityTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4,
Tff7b72selfTff7b72.Td2a8ffAPP_NAMETb4b4b4,
Ta5d6ff"Ta5d6ffreceiveTa5d6ff"Tb4b4b4,
Tb4b4b4)

Te6edf3link Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3listener_destinationTb4b4b4)
Te6edf3timeout_after Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3timeout
Tff7b72while Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVE Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3timeout_afterTb4b4b4:
Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)

Tff7b72if Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffCould not establish link to destinationTa5d6ff"
Tff7b72raise Tf85149TimeoutErrorTb4b4b4(Te6edf3msgTb4b4b4)

Te6edf3linkTff7b72.Td2a8ffidentifyTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4)

Te6edf3request_resolved Tff7b72= Tff7b72False
Te6edf3request_status Tff7b72= Ta5d6ff"Ta5d6ffunknownTa5d6ff"
Te6edf3resource_resolved Tff7b72= Tff7b72False
Te6edf3resource_status Tff7b72= Ta5d6ff"Ta5d6ffunrequestedTa5d6ff"
Te6edf3current_resource Tff7b72= Tff7b72None

Tff7b72def Td2a8ffrequest_responseTb4b4b4(Te6edf3request_receiptTb4b4b4)Tb4b4b4:
Tff7b72nonlocal Te6edf3request_resolvedTb4b4b4, Te6edf3request_status
Tff7b72if Tff7b72not Te6edf3request_receiptTff7b72.Td2a8ffresponseTb4b4b4:
Te6edf3request_status Tff7b72= Ta5d6ff"Ta5d6ffnot_foundTa5d6ff"
Tff7b72elif Te6edf3request_receiptTff7b72.Td2a8ffresponse Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3request_status Tff7b72= Ta5d6ff"Ta5d6ffremote_errorTa5d6ff"
Tff7b72elif Te6edf3request_receiptTff7b72.Td2a8ffresponse Tff7b72== Tff7b72selfTff7b72.Td2a8ffREQ_FETCH_NOT_ALLOWEDTb4b4b4:
Te6edf3request_status Tff7b72= Ta5d6ff"Ta5d6fffetch_not_allowedTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3request_status Tff7b72= Ta5d6ff"Ta5d6fffoundTa5d6ff"
Te6edf3request_resolved Tff7b72= Tff7b72True

Tff7b72def Td2a8ffrequest_failedTb4b4b4(Te6edf3request_receiptTb4b4b4)Tb4b4b4:
Tff7b72nonlocal Te6edf3request_resolvedTb4b4b4, Te6edf3request_status
Te6edf3request_status Tff7b72= Ta5d6ff"Ta5d6ffunknownTa5d6ff"
Te6edf3request_resolved Tff7b72= Tff7b72True

Tff7b72def Td2a8fffetch_resource_startedTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72nonlocal Te6edf3resource_statusTb4b4b4, Te6edf3current_resource
Te6edf3current_resource Tff7b72= Te6edf3resource

Tff7b72def Td2a8ffprogress_callbackTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3on_progressTb4b4b4:
Te6edf3progress Tff7b72= Te6edf3resourceTff7b72.Td2a8ffget_progressTb4b4b4(Tb4b4b4)
Te6edf3on_progressTb4b4b4(Te6edf3progressTb4b4b4)

Te6edf3current_resourceTff7b72.Td2a8ffprogress_callbackTb4b4b4(Te6edf3progress_callbackTb4b4b4)
Te6edf3resource_status Tff7b72= Ta5d6ff"Ta5d6ffstartedTa5d6ff"

Te6edf3saved_filename Tff7b72= Tff7b72None

Tff7b72def Td2a8fffetch_resource_concludedTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72nonlocal Te6edf3resource_resolvedTb4b4b4, Te6edf3resource_statusTb4b4b4, Te6edf3saved_filename
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffmetadataTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3filename Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(
Te6edf3resourceTff7b72.Td2a8ffmetadataTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3save_pathTb4b4b4:
Te6edf3save_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3save_pathTb4b4b4)Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3save_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3saved_filename Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3save_dirTb4b4b4, Te6edf3filenameTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3saved_filename Tff7b72= Te6edf3filename

Te6edf3counter Tff7b72= T79c0ff0
Tff7b72if Te6edf3allow_overwriteTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3saved_filenameTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3saved_filenameTb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
T8b949e# Failed to delete existing file, which is fine,
T8b949e# we'll just fall through to the naming loop
Tff7b72pass

Tff7b72while Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3saved_filenameTb4b4b4)Tb4b4b4:
Te6edf3counter Tff7b72+Tff7b72= T79c0ff1
Te6edf3baseTb4b4b4, Te6edf3ext Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffsplitextTb4b4b4(Te6edf3filenameTb4b4b4)
Te6edf3saved_filename Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3saved_filenameTb4b4b4) Tff7b72if Te6edf3save_path Tff7b72else Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4,
Ta5d6fffTa5d6ff"Tffd700{Te6edf3baseTffd700}Ta5d6ff.Tffd700{Te6edf3counterTffd700}Tffd700{Te6edf3extTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)

Te6edf3shutilTff7b72.Td2a8ffmoveTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffdataTff7b72.Td2a8ffnameTb4b4b4, Te6edf3saved_filenameTb4b4b4)
Te6edf3resource_status Tff7b72= Ta5d6ff"Ta5d6ffcompletedTa5d6ff"
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3resource_status Tff7b72= Ta5d6ff"Ta5d6fferrorTa5d6ff"
Tff7b72raise Te6edf3e
Tff7b72elseTb4b4b4:
Te6edf3resource_status Tff7b72= Ta5d6ff"Ta5d6fferrorTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3resource_status Tff7b72= Ta5d6ff"Ta5d6fffailedTa5d6ff"

Te6edf3resource_resolved Tff7b72= Tff7b72True

Te6edf3linkTff7b72.Td2a8ffset_resource_strategyTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACCEPT_ALLTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_started_callbackTb4b4b4(Te6edf3fetch_resource_startedTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_concluded_callbackTb4b4b4(Te6edf3fetch_resource_concludedTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffrequestTb4b4b4(
Ta5d6ff"Ta5d6fffetch_fileTa5d6ff"Tb4b4b4,
Te6edf3dataTff7b72=Te6edf3file_pathTb4b4b4,
Te6edf3response_callbackTff7b72=Te6edf3request_responseTb4b4b4,
Te6edf3failed_callbackTff7b72=Te6edf3request_failedTb4b4b4,
Tb4b4b4)

Tff7b72while Tff7b72not Te6edf3request_resolvedTb4b4b4:
Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)

Tff7b72if Te6edf3request_status Tff7b72== Ta5d6ff"Ta5d6fffetch_not_allowedTa5d6ff"Tb4b4b4:
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffFetch request not allowed by remoteTa5d6ff"
Tff7b72raise Tf85149PermissionErrorTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72if Te6edf3request_status Tff7b72== Ta5d6ff"Ta5d6ffnot_foundTa5d6ff"Tb4b4b4:
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3msg Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffFile not found on remote: Tffd700{Te6edf3file_pathTffd700}Ta5d6ff"
Tff7b72raise Tf85149FileNotFoundErrorTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72if Te6edf3request_status Tff7b72== Ta5d6ff"Ta5d6ffremote_errorTa5d6ff"Tb4b4b4:
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffRemote error during fetch requestTa5d6ff"
Tff7b72raise Tf85149ExceptionTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72if Te6edf3request_status Tff7b72== Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4:
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffUnknown error during fetch requestTa5d6ff"
Tff7b72raise Tf85149ExceptionTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72while Tff7b72not Te6edf3resource_resolvedTb4b4b4:
Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)

Tff7b72if Te6edf3resource_status Tff7b72== Ta5d6ff"Ta5d6ffcompletedTa5d6ff"Tb4b4b4:
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffcompletedTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffile_pathTa5d6ff"Tb4b4b4: Te6edf3saved_filenameTb4b4b4,
Tb4b4b4}
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3msg Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffTransfer failed: Tffd700{Te6edf3resource_statusTffd700}Ta5d6ff"
Tff7b72raise Tf85149ExceptionTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72def Td2a8ffget_transfer_statusTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3transfer_idTb4b4b4: Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3transfer_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4:
Te6edf3transfer Tff7b72= Tff7b72selfTff7b72.Td2a8ffactive_transfersTb4b4b4[Te6edf3transfer_idTb4b4b4]
Te6edf3resource Tff7b72= Te6edf3transferTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffresourceTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3resourceTb4b4b4:
Te6edf3progress Tff7b72= Te6edf3resourceTff7b72.Td2a8ffget_progressTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6fftransfer_idTa5d6ff"Tb4b4b4: Te6edf3transfer_idTb4b4b4,
Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4: Te6edf3transferTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffprogressTa5d6ff"Tb4b4b4: Te6edf3progressTb4b4b4,
Ta5d6ff"Ta5d6fffile_pathTa5d6ff"Tb4b4b4: Te6edf3transferTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fffile_pathTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffsaved_pathTa5d6ff"Tb4b4b4: Te6edf3transferTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffsaved_pathTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fffilenameTa5d6ff"Tb4b4b4: Te6edf3transferTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fffilenameTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Te6edf3transferTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72return Tff7b72None


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────